/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

import Logica.controladores.ControladorCuotas;
import Logica.controladores.ControladorUsuario;
import Logica.cuenta.Cuota;
import Logica.cuenta.DataCuota;
import Logica.usuario.DataUsuario;
import Logica.usuario.Usuario;
import Utilidades.Utils;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;

/**
 *
 * @author manuel
 */
public class Persistencia {
    private static Persistencia _instancia = null;
    private static Connection _cone = null;
    private static Statement _st = null;
    
    

    public Persistencia() throws SQLException, ClassNotFoundException{
       
           Class.forName("org.postgresql.Driver");
           _cone = DriverManager.getConnection("jdbc:postgresql://localhost:5432/cajupay", "postgres", "maxis");
           _st = _cone.createStatement();
    }
    
    public static Persistencia getInstance() throws SQLException, ClassNotFoundException {
        if (_instancia == null) {
            _instancia = new Persistencia();
        }
        return _instancia;
    }

    
    public void guardarUsuario(DataUsuario du) throws SQLException{
        _st.executeUpdate("Insert into Usuario values('"+du.getNombre()+"','"+du.getApellido()+
                "','"+du.getCedula()+"','"+du.getCiudad()+"','"+Utils.dateSql(du.getfNac())+"','"+
                du.getDireccion()+"','"+du.getTel()+"','"+du.getCel()+"',1)");
    }
    
    public void eliminarUsuario (int codigo) throws SQLException{
        //_st.executeQuery("Delete From cuota  where codigo = "+codigo+"");
        _st.executeUpdate("Update usuario set activo=0 where codigo = "+codigo+"");
        
    }
    
    public List<DataUsuario> getUsuarios() throws SQLException{
        List <DataUsuario> ret = new ArrayList();
        ResultSet rs = _st.executeQuery("SELECT * FROM usuario");
        while (rs.next()){
            String nombre= rs.getString("nombre");
            String apellido= rs.getString("apellido");
            String cedula= rs.getString("cedula");
            String direccion= rs.getString("direccion");
            String ciudad= rs.getString("ciudad");
            String telefono= rs.getString("telefono");
            String celular= rs.getString("celular");
            Calendar fNac= Utils.dateCalendar(rs.getString("fnac")); 
            int activo= Integer.parseInt(rs.getString("activo"));
            int codigo= Integer.parseInt(rs.getString("codigo"));
            ret.add(new DataUsuario(nombre, apellido, direccion, cedula, ciudad, fNac, telefono, celular, activo, codigo));
        }
        rs.close();
        return ret;
    }
    
    public void getCoutasPorUsuario(int codigo) throws SQLException{
        List <DataUsuario> ret = new ArrayList();
        ResultSet rs = _st.executeQuery("SELECT * FROM couta WHERE codigo="+codigo+"");
        ControladorUsuario cu = ControladorUsuario.getInstance();
        Usuario u = cu.BuscarUsuario(codigo);
        List<Cuota> lista = new ArrayList<>();
        while (rs.next()){
            lista.add(new Cuota(rs.getBoolean("pago"), rs.getInt("mes"), rs.getInt("anio"),ControladorUsuario.getInstance().BuscarUsuario(rs.getInt("codigo")),
                    Utils.dateCalendar(rs.getString("fecha"))));
        }
        cu.cargarCuotas(codigo, lista);
        rs.close();
    }
    
    public void ModificarUsuario(DataUsuario du) throws SQLException{
        String query;
        //GUARDO NUEVO DATOS DEL USR
        query = ("Update Usuario  SET nombre='" + du.getNombre()
                + "',apellido='" + du.getApellido()
                + "',cedula='" + du.getCedula()
                + "',ciudad='" + du.getCiudad()
                + "',fnac='" + Utils.dateSql(du.getfNac())
                + "',direccion='" + du.getDireccion()
                + "',telefono=" + du.getTel()
                + ",celular=" + du.getCel()
                + " where codigo=" + du.getCodigo() + ";");
        //EJECUTO LAS QUERY
        _st.executeUpdate(query);
    }
    
    public void GuardarCuota(DataCuota c)throws SQLException{
        _st.executeUpdate("Insert into Cuota values("+c.getUsuario().getCodigo()+","+
                 c.getMes()+","+c.getAnio()+","+c.getPaga()+",'"+Utils.dateSql(c.getFechaPago())+"')");
           }
    
    public List<DataCuota> getCuotas() throws SQLException{
        List<DataCuota> _listaCuota = new ArrayList<>();
        ResultSet rs = _st.executeQuery("SELECT * FROM cuota");
        while(rs.next()){
            int codigo = rs.getInt("codigo");
            int mes = rs.getInt("mes");
            int anio = rs.getInt("anio");
            boolean paga = rs.getBoolean("pago");
            Calendar fecha = Utils.dateCalendar(rs.getString("fecha"));
           
            _listaCuota.add(new DataCuota(ControladorUsuario.getInstance().BuscarUsuario(codigo),paga,mes,anio,fecha));
        }
        rs.close();
        return _listaCuota;
       }
  public void CuotaPagada(DataCuota c) throws SQLException{
     String query = ("Update cuota SET pago = "+true+",fecha= '"+Utils.dateSql(c.getFechaPago())+"'"
             + "where codigo="+c.getUsuario().getCodigo()+ " AND mes="+c.getMes()+" AND anio="+c.getAnio()+";");
     _st.executeUpdate(query);
      }
    
    public void CrearCuotasDelMes(int mes, int anio) throws SQLException, ClassNotFoundException{
      //Calendar fecha = Calendar.getInstance();
      
        for(Usuario usr : ControladorUsuario.getInstance().getListausr()){
            ResultSet rs = _st.executeQuery ("SELECT mes FROM cuota WHERE mes = "+mes+" AND anio = "+anio+" AND codigo = "+usr.getCodigo()+""); 
            if(!rs.next()){
                ControladorCuotas cc = ControladorCuotas.getInstance();
                if(usr.getActivo()==1){
                 Calendar f =   Utils.dateCalendar( "00-00-0000");
                          
                    Cuota dc = new Cuota(false,mes,anio,usr,f);
                    cc.GuardarCuota(dc, usr);
                }
            }
        }
    }
}

